#include <iostream>
#include <future>
#include <thread>
/*
    future是一个类模板，用来辅助获取异步任务（函数）的结果，需要搭配异步调用来使用
    C++11提供了async、packaged_task、promise来辅助执行异步任务、设置结果、获取结果

    async：函数模板，根据执行策略同步或异步来执行一个任务，返回一个future对象
    执行策略：
        launch::async：异步执行，返回一个future对象；
                    当你调用async函数的时候，内部就会创建一个线程来执行注册的回调函数；
                    通过返回的future对象提供的get方法就可以获取到异步结果；
                    当你调用future对象的get方法时，内部会阻塞当前线程，直到异步任务执行完成；
        launch::deferred：同步执行（延迟执行），返回一个future对象；
                    当你调用future对象的get/wait方法时，async函数才会执行，然后返回结果，由一个线程来完成
*/
int add(int a, int b)
{
    std::cout << "add\n";
    return a + b;
}

int main()
{
    // // 测试launch::async策略
    // std::future<int> res = std::async(std::launch::async, add, 1, 2);
    // std::this_thread::sleep_for(std::chrono::seconds(2));
    // std::cout << "res: " << res.get() << std::endl;

    // 测试launch::deferred策略
    std::future<int> res = std::async(std::launch::deferred, add, 1, 2);
    std::cout << "res: " << res.get() << std::endl;
    return 0;
}